package function

import "fmt"

func Max(num1, num2 int) int {
	if num1 > num2 {
		return num1

	} else {
		return num2
	}
}
func Swap(a, b int) (int, int) {

	return b, a
}

//值传递
func SwapValue(a, b int) {

	temp := a
	a = b
	b = temp
}

//值传递
func TestSwapValue() {
	/* 定义局部变量 */
	var a int = 100
	var b int = 200

	fmt.Printf("交换前 a 的值为 : %d\n", a)
	fmt.Printf("交换前 b 的值为 : %d\n", b)

	/* 通过调用函数来交换值 */
	SwapValue(a, b)

	fmt.Printf("交换后 a 的值 : %d\n", a)
	fmt.Printf("交换后 b 的值 : %d\n", b)
}

//值传递
func SwapValueAddress(a, b *int) {

	temp := *a
	*a = *b
	*b = temp

}

//值传递
func TestSwapValueAddress() {
	/* 定义局部变量 */
	var a int = 100
	var b int = 200

	fmt.Printf("交换前 a 的值为 : %d\n", a)
	fmt.Printf("交换前 b 的值为 : %d\n", b)

	/* 通过调用函数来交换值 */
	SwapValueAddress(&a, &b)

	fmt.Printf("交换后 a 的值 : %d\n", a)
	fmt.Printf("交换后 b 的值 : %d\n", b)

}

//函数作为参数
func Param() {
	getSum := func(a, b int) int {
		return a + b
	}
	fmt.Println(getSum(1, 5))
}

//闭包
//匿名函数，可作为闭包。匿名函数是一个"内联"语句或表达式。匿名函数的优越性在于可以直接使用函数内的变量，不必申明。
//以下实例中，我们创建了函数 getSequence() ，返回另外一个函数
func getSequence() func() int {
	i := 0
	return func() int {
		i += 1
		return i
	}
}
func TestClosure() {
	sequence := getSequence()
	fmt.Println(sequence())
	fmt.Println(sequence())
	f := getSequence()
	fmt.Println(f())
	fmt.Println(f())

}

//go语言中函数和方法
//一个方法就是一个包含接收者的函数
type Circle struct {
	Radius float64
}

//方法
func (c Circle) GetArea() float64 {
	return c.Radius * c.Radius
}

func TestFunction() {
	var c1 Circle
	c1.Radius = 0.4

}
